/*!
 * \file WtCtaEngine.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader CTA交易引擎定义
 * 
 * \details 该文件定义了WonderTrader的CTA（商品交易顾问）交易引擎，提供：
 *          - CTA策略的运行环境和管理
 *          - 策略上下文的创建和管理
 *          - 行情数据的处理和分发
 *          - 交易信号的执行和管理
 *          - 定时调度和事件处理
 *          - 执行器的集成和管理
 */
#pragma once
#include "../Includes/ICtaStraCtx.h"
#include "WtExecMgr.h"
#include "WtEngine.h"

NS_WTP_BEGIN
class WTSVariant;

/*!
 * \brief CTA策略上下文智能指针类型定义
 */
typedef std::shared_ptr<ICtaStraCtx> CtaContextPtr;

class WtCtaRtTicker;

/*!
 * \class WtCtaEngine
 * \brief WonderTrader CTA交易引擎
 * 
 * \details CTA交易引擎类，继承自WtEngine和IExecuterStub，提供以下核心功能：
 *          
 *          **策略管理**：
 *          - CTA策略上下文的创建和管理
 *          - 策略的生命周期管理
 *          - 策略间的隔离和通信
 *          
 *          **数据处理**：
 *          - 实时行情数据的接收和分发
 *          - K线数据的处理和推送
 *          - 历史数据的查询和管理
 *          
 *          **交易执行**：
 *          - 交易信号的生成和处理
 *          - 执行器的管理和调度
 *          - 持仓变化的监控和处理
 *          
 *          **时间管理**：
 *          - 交易时段的管理
 *          - 定时任务的调度
 *          - 会话事件的处理
 *          
 * \note CTA引擎适用于中低频交易策略，支持多策略并行运行
 * \see WtEngine, IExecuterStub, ICtaStraCtx
 */
class WtCtaEngine : public WtEngine, public IExecuterStub
{
public:
	/*!
	 * \brief 构造函数
	 */
	WtCtaEngine();
	
	/*!
	 * \brief 析构函数
	 */
	virtual ~WtCtaEngine();

public:
	//////////////////////////////////////////////////////////////////////////
	//WtEngine接口实现
	/*!
	 * \brief 处理推送的行情数据
	 * \param newTick 新的tick数据
	 * \param hotFlag 热点标志
	 * \details 重写基类方法，处理CTA引擎特有的行情数据处理逻辑
	 */
	virtual void handle_push_quote(WTSTickData* newTick, uint32_t hotFlag) override;

	/*!
	 * \brief tick数据回调
	 * \param stdCode 标准合约代码
	 * \param curTick 当前tick数据
	 * \details 处理tick数据，分发给相关的CTA策略
	 */
	virtual void on_tick(const char* stdCode, WTSTickData* curTick) override;

	/*!
	 * \brief K线数据回调
	 * \param stdCode 标准合约代码
	 * \param period K线周期
	 * \param times 周期倍数
	 * \param newBar 新的K线数据
	 * \details 处理K线数据，分发给相关的CTA策略
	 */
	virtual void on_bar(const char* stdCode, const char* period, uint32_t times, WTSBarStruct* newBar) override;

	/*!
	 * \brief 初始化回调
	 * \details 引擎初始化完成后的回调处理
	 */
	virtual void on_init() override;
	
	/*!
	 * \brief 交易时段开始回调
	 * \details 处理交易时段开始事件
	 */
	virtual void on_session_begin() override;
	
	/*!
	 * \brief 交易时段结束回调
	 * \details 处理交易时段结束事件
	 */
	virtual void on_session_end() override;

	/*!
	 * \brief 运行引擎
	 * \param bAsync 是否异步运行，默认false
	 * \details 启动CTA引擎的运行循环
	 */
	virtual void run(bool bAsync = false) override;

	/*!
	 * \brief 初始化引擎
	 * \param cfg 配置信息
	 * \param bdMgr 基础数据管理器
	 * \param dataMgr 数据管理器
	 * \param hotMgr 热点管理器
	 * \param notifier 事件通知器
	 * \details 初始化CTA引擎的各个组件
	 */
	virtual void init(WTSVariant* cfg, IBaseDataMgr* bdMgr, WtDtMgr* dataMgr, IHotMgr* hotMgr, EventNotifier* notifier) override;

	/*!
	 * \brief 判断是否在交易时段
	 * \return true-在交易时段，false-不在交易时段
	 */
	virtual bool isInTrading() override;
	
	/*!
	 * \brief 时间转换为分钟
	 * \param uTime 时间
	 * \return 分钟数
	 */
	virtual uint32_t transTimeToMin(uint32_t uTime) override;

	///////////////////////////////////////////////////////////////////////////
	//IExecuterStub接口实现
	/*!
	 * \brief 获取实时时间
	 * \return 实时时间戳
	 */
	virtual uint64_t get_real_time() override;
	
	/*!
	 * \brief 获取品种信息
	 * \param stdCode 标准合约代码
	 * \return 品种信息指针
	 */
	virtual WTSCommodityInfo* get_comm_info(const char* stdCode) override;
	
	/*!
	 * \brief 获取交易时段信息
	 * \param stdCode 标准合约代码
	 * \return 交易时段信息指针
	 */
	virtual WTSSessionInfo* get_sess_info(const char* stdCode) override;
	
	/*!
	 * \brief 获取热点管理器
	 * \return 热点管理器指针
	 */
	virtual IHotMgr* get_hot_mon() { return _hot_mgr; }
	
	/*!
	 * \brief 获取交易日期
	 * \return 交易日期，格式YYYYMMDD
	 */
	virtual uint32_t get_trading_day() { return _cur_tdate; }


public:
	/*!
	 * \brief 定时调度处理
	 * \param curDate 当前日期，格式YYYYMMDD
	 * \param curTime 当前时间，格式HHMM
	 * \details 处理定时调度事件，触发策略的定时回调
	 */
	void on_schedule(uint32_t curDate, uint32_t curTime);	

	/*!
	 * \brief 处理持仓变化
	 * \param straName 策略名称
	 * \param stdCode 标准合约代码
	 * \param diffQty 持仓变化量
	 * \details 处理策略持仓变化事件
	 */
	void handle_pos_change(const char* straName, const char* stdCode, double diffQty);

	/*!
	 * \brief 添加策略上下文
	 * \param ctx 策略上下文智能指针
	 * \details 向引擎中添加新的CTA策略上下文
	 */
	void addContext(CtaContextPtr ctx);
	
	/*!
	 * \brief 获取策略上下文
	 * \param id 策略ID
	 * \return 策略上下文智能指针，失败返回空指针
	 * \details 根据策略ID获取对应的策略上下文
	 */
	CtaContextPtr	getContext(uint32_t id);

	/*!
	 * \brief 添加执行器
	 * \param executer 执行器智能指针
	 * \details 向执行管理器中添加新的执行器，并设置回调接口
	 */
	inline void addExecuter(ExecCmdPtr executer)
	{
		_exec_mgr.add_executer(executer);
		executer->setStub(this);
	}

private:
	/*!
	 * \brief 策略上下文映射表类型定义
	 */
	typedef faster_hashmap<uint32_t, CtaContextPtr> ContextMap;
	ContextMap		_ctx_map;		/*!< 策略上下文映射表 */

	WtCtaRtTicker*	_tm_ticker;		/*!< CTA实时行情处理器 */

	WtExecuterMgr	_exec_mgr;		/*!< 执行管理器 */

	WTSVariant*		_cfg;			/*!< 配置信息 */
};

NS_WTP_END

